package com.bandaotixi.cashier.api.common;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

@EqualsAndHashCode(callSuper = true)
@Data
public class BaseParams extends HashMap<String, Object> {

    public <T> Page<T> page() {
        return new Page<>(Math.max(1, getPageNum()), Math.min(100, Math.max(1, getPageSize())));
    }

    public Integer getPageNum() {
        return getInt("pageNum", 1);
    }

    public Integer getPageSize() {
        return getInt("pageSize", 20);
    }

    public Integer getInt(String key) {
        return getInt(key, null);
    }

    public Integer getInt(String key, Integer defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Integer.parseInt(value.toString());
    }

    public Long getLong(String key) {
        return getLong(key, null);
    }

    public Long getLong(String key, Long defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Long.parseLong(value.toString());
    }

    public Double getDouble(String key) {
        return getDouble(key, null);
    }

    public Double getDouble(String key, Double defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Double.parseDouble(value.toString());
    }

    public String getString(String key) {
        return getString(key, null);
    }

    public String getString(String key, String defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return value.toString();
    }

    public Boolean getBoolean(String key) {
        return getBoolean(key, null);
    }

    public Boolean getBoolean(String key, Boolean defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Boolean.parseBoolean(value.toString());
    }

    public LocalDateTime getLocalDateTime(String key) {
        return getLocalDateTime(key, null);
    }

    public LocalDateTime getLocalDateTime(String key, LocalDateTime defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return LocalDateTime.parse(value.toString());
    }

    public List<Integer> getIntList(String key) {
        return getIntList(key, null);
    }

    public List<Integer> getIntList(String key, List<Integer> defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Arrays.stream(value.toString().split(",")).map(Integer::parseInt).toList();
    }

    public List<Long> getLongList(String key) {
        return getLongList(key, null);
    }

    public List<Long> getLongList(String key, List<Long> defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Arrays.stream(value.toString().split(",")).map(Long::parseLong).toList();
    }

    public List<String> getStringList(String key) {
        return getStringList(key, null);
    }

    public List<String> getStringList(String key, List<String> defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        return Arrays.asList(value.toString().split(","));
    }

    public boolean isEmpty(String key) {
        Object value = get(key);
        return value == null || value.toString().trim().isEmpty();
    }

    public boolean isNotEmpty(String key) {
        return !isEmpty(key);
    }

}
